// import { createAxios } from 'rsf';
import axios from 'axios';
import { message } from 'antd';
import debounce from 'lodash/debounce';



const showMessageDelayTime = 500;
// 延迟展示错误信息，针对用户不断点击或者多个请求同时报错的情况
// ${showErrorMessageDelayTime}秒内只展示一次错误信息
// 用户体验相关，不需要也可以，多个 message.error 的情况还是比较少的。
export const showErrorMessageDebounce = debounce((messageStr, callback?: any) => {
  if (callback) callback();
  message.error(messageStr);
}, showMessageDelayTime);

export const showSuccessMessageDebounce = debounce((messageStr, callback?: any) => {
  if (callback) callback();
  message.success(messageStr);
}, showMessageDelayTime);

// 返回 axio，详细请参考 https://github.com/axios/axios
const requestV1Instance = axios.create({
  // 超时时间 30 秒
  timeout: 30 * 1000,
  baseURL: '/api/',
});

const requestV2Instance = axios.create({
  // 超时时间 30 秒
  timeout: 30 * 1000,
  baseURL: '/api/',
});

let pending: any[] = []; // 声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
let removePending = (config: any) => {
  for (let p in pending) {
    // 当前请求在数组中存在时执行函数体
    if (pending[p].u === `${config.url} ${JSON.stringify(config.data)}&${config.method}`) { 
      pending[p].f(); //执行取消操作
      pending.splice(Number(p), 1);
    }
  }
}


function interceptors(req: any) {
  // 请求拦截器
  req.interceptors.request.use((request: any) => {
    const { headers } = request;
    // const token = cookie.getCookie('token');
    const token = window.localStorage.getItem('token');
    headers.Authorization = `Bearer ${token}`;
    headers['Cache-Control'] = 'no-cache';
    // console.log(request);

    // 取消重复请求
    removePending(request); // 在一个axios发送前执行一下取消操作
    request.cancelToken = new cancelToken((c) => {
      // 这里的axios标识我是用请求地址&请求方式拼接的字符串
      pending.push({ u: `${request.url} ${JSON.stringify(request.data)}&${request.method}`, f: c });
    });
    return request
  });
  // 响应拦截器
  req.interceptors.response.use(
    (response: any) => {
      // 已结束请求删除
      removePending(response.config);
      return response
    },
    (error: any) => {
      if (axios.isCancel(error)) {
        // 取消请求的情况
        console.log(error);
        // throw Error('cancel');
        return;
      }

      // 统一处理错误信息
      if (error.response) {
        if (error.response.config.showNoneFailMessgeGlobally) {
          // 单个请求设置了 showNoneFailMessgeGlobally = true，不做全局提示。
          return;
        }

        // 服务端有响应，但是请求码是非 2xx 请求
        // 默认非 2xx 请求都是 非法请求
        const { data, status } = error.response;
        if (status === 401) {
          // token 过期失效
          showErrorMessageDebounce(data.message || '登录失效，需重新登录。');
          setTimeout(() => {
            // 为什么不用 history.push，因为会遗留各种 redux 的状态数据，
            // 而且登录用户也可能不是上一个用户，这种情况还是有可能发生的。
            // 所以直接重载页面，跳转到登录页面，就不用考虑上面的情况了。
            window.location.href = '/user/login';
          }, 800);

          return;
        }
        if (String(status).substr(0, 1) === '5') {
          showErrorMessageDebounce('系统错误。');
          return;
        }
        if (data) {
          // 404 返回的 不一定是 json 数据，只有 data 不为 null，才是返回了 json 格式
          showErrorMessageDebounce(data.message || error.response.statusText);
        } else {
          showErrorMessageDebounce(error.response.statusText);
        }
      } else if (error.request) {
        // 服务端无响应的情况
        // 网络无连接时会立即返回错误，请求超时（默认8秒）返回错误，跨域返回错误等情况
        showErrorMessageDebounce('网络连接出问题，或者连接超时。');
      } else {
        // axios 配置错误，一般都不会出现这个问题的。
        showErrorMessageDebounce('发生了未知错误。');
      }
    },
  );

  return req;
}

const requestV2 = interceptors(requestV2Instance);
const requestV1 = interceptors(requestV1Instance);


export  { requestV2, requestV1 };

export default ''
